home *** CD-ROM | disk | FTP | other *** search
/ Deutsche Edition 1 / Deutsche Edition 1.iso / amok / amok_lha / amok72.lha / while-Interpreter / Source / QuadDrucke.MOD < prev    next >
Text File  |  1993-08-15  |  7KB  |  261 lines

  1.  
  2. IMPLEMENTATION MODULE QuadDrucke;
  3.  
  4. FROM InOut IMPORT Echo, Read, ReadCard, WriteCard, WriteLn, Write, WriteString;
  5. FROM QuadLese IMPORT QuadZeile, MaxZeile, MaxBefehle, arrList, arrQuad;
  6.  
  7. PROCEDURE DruckeLeerzeichen(Zaehler : CARDINAL);
  8. BEGIN
  9.   WHILE Zaehler # 0 DO
  10.     WriteString(" ");
  11.     DEC(Zaehler);
  12.   END;
  13. END DruckeLeerzeichen;
  14.  
  15.  
  16. PROCEDURE DruckeQuadrupel(Zeile : QuadZeile);
  17. VAR i : CARDINAL;
  18. BEGIN
  19.   Write("(");
  20.   WriteCard(Zeile.Zeile,2);
  21.   Write(";");
  22.   FOR i:=1 TO MaxZeile DO
  23.     IF (Zeile.Befehl[i] >= " ") AND (Zeile.Befehl[i] <= "z") THEN
  24.       Write(Zeile.Befehl[i]);
  25.     ELSE
  26.       Write(" ");
  27.     END;
  28.   END;
  29.   Write(";");
  30.   WriteCard(Zeile.IFzeile,2);
  31.   Write(";");
  32.   WriteCard(Zeile.ELSEzeile,2);
  33.   Write(")");
  34. END DruckeQuadrupel;
  35.  
  36.  
  37. PROCEDURE DruckeZuweisung(BefehlsListe : arrList;
  38.                           Zeiger       : CARDINAL) : CARDINAL;
  39. BEGIN
  40.   Write("X");
  41.   INC(Zeiger);
  42.   
  43.   WHILE BefehlsListe[Zeiger] # ":" DO
  44.     Write(BefehlsListe[Zeiger]);
  45.     INC(Zeiger);
  46.   END;
  47.   
  48.   WriteString(":=");
  49.   INC(Zeiger);
  50.   
  51.   IF BefehlsListe[Zeiger] = "X" THEN
  52.     Write("X");
  53.     INC(Zeiger);
  54.     WHILE ((BefehlsListe[Zeiger] >= "0") AND (BefehlsListe[Zeiger] <= "9")) DO
  55.       Write(BefehlsListe[Zeiger]);
  56.       INC(Zeiger);
  57.     END;
  58.   ELSE
  59.     IF (BefehlsListe[Zeiger] >= "0") AND (BefehlsListe[Zeiger] <= "9") THEN
  60.       WHILE ((BefehlsListe[Zeiger] >= "0") AND (BefehlsListe[Zeiger] <= "9")) DO
  61.         Write(BefehlsListe[Zeiger]);
  62.         INC(Zeiger);
  63.       END;
  64.     ELSE
  65.       IF BefehlsListe[Zeiger] = "p" THEN
  66.         WriteString("pred");
  67.         INC(Zeiger);
  68.         WHILE BefehlsListe[Zeiger] # ")" DO
  69.           Write(BefehlsListe[Zeiger]);
  70.           INC(Zeiger);
  71.         END;
  72.         Write(")");
  73.         INC(Zeiger);
  74.       ELSE
  75.         WriteString("succ");
  76.         INC(Zeiger);
  77.         WHILE BefehlsListe[Zeiger] # ")" DO
  78.           Write(BefehlsListe[Zeiger]);
  79.           INC(Zeiger);
  80.         END;
  81.         Write(")");
  82.         INC(Zeiger);
  83.       END
  84.     END;
  85.   END;
  86.   IF BefehlsListe[Zeiger] = ";" THEN
  87.     Write(";");
  88.     INC(Zeiger);
  89.   END;
  90.   WriteLn;
  91.   RETURN Zeiger;
  92. END DruckeZuweisung;
  93.  
  94.  
  95. PROCEDURE DruckeSchleife(BefehlsListe : arrList;
  96.                          Zeiger       : CARDINAL         ) : CARDINAL;
  97. BEGIN
  98.   WriteString("while ");
  99.   INC(Zeiger);
  100.   WHILE BefehlsListe[Zeiger] # "#" DO
  101.     Write(BefehlsListe[Zeiger]);
  102.     INC(Zeiger);
  103.   END;
  104.   WriteString(" # ");
  105.   INC(Zeiger);
  106.   WHILE BefehlsListe[Zeiger] # "d" DO
  107.     Write(BefehlsListe[Zeiger]);
  108.     INC(Zeiger);
  109.   END;
  110.   WriteString(" do");
  111.   WriteLn;
  112.   INC(Zeiger);
  113.   RETURN Zeiger;
  114. END DruckeSchleife;
  115.  
  116.  
  117. PROCEDURE DruckeUnterprogramm(BefehlsListe : arrList;
  118.                               Zeiger       : CARDINAL) : CARDINAL;
  119. BEGIN
  120.   Write("U");
  121.   INC(Zeiger);
  122.  
  123.   WHILE ((BefehlsListe[Zeiger] >= "0") AND (BefehlsListe[Zeiger] <= "9")) DO
  124.     Write(BefehlsListe[Zeiger]);
  125.     INC(Zeiger);
  126.   END;
  127.   
  128.   IF BefehlsListe[Zeiger] = ";" THEN
  129.     Write(";");
  130.     INC(Zeiger);
  131.   END;
  132.  
  133.   WriteLn;
  134.   RETURN Zeiger;
  135. END DruckeUnterprogramm;
  136.  
  137.  
  138. PROCEDURE Drucke(BefehlsListe : arrList; QuadListe : arrQuad);
  139. CONST Anzahl = 2;
  140. VAR Leerzeichen, i,
  141.     While,                  (* Zaehler fuer noch offene 'while' Anweisungen. *)
  142.     Zaehler,                (* Zaehler fuer Quadrupel-Zeilen.                *)
  143.     Begin,                  (* Zaehler fuer noch offene 'begin' Anweisungen. *)
  144.     Zeiger        : CARDINAL;         (* Zeigt auf den zu druckenden Befehl. *)
  145.     Fehler        : BOOLEAN;          (* Wird benoetigt um die               *)
  146.                                       (* verschachtelten IF-Anweisungen zu   *)
  147.                                       (* vermeiden.                          *)
  148.     WhileBegin    : ARRAY [1..MaxBefehle] OF BOOLEAN;
  149.                             (* Falls ein while-begin Konstrukt aufgetreten   *)
  150.                             (* ist, wird dies hier vermerkt.                 *)
  151. BEGIN
  152.   WriteLn;WriteLn;
  153.   FOR i:=1 TO MaxBefehle DO
  154.     WhileBegin[i]:=FALSE;
  155.   END;
  156.   Leerzeichen:=1;
  157.   While:=0;
  158.   Zaehler:=1;
  159.   Begin:=0;
  160.   Zeiger:=1;
  161.  
  162.   REPEAT
  163.     Fehler:=TRUE;
  164.  
  165.     
  166.     IF (BefehlsListe[Zeiger] = "b") OR (BefehlsListe[Zeiger] = "e") THEN
  167.       DruckeLeerzeichen(11+MaxZeile);     (*     3 Semikolons                *)
  168.                                           (*     2 Klammern                  *)
  169.                                           (* 3 * 2 fuer Zeilennummern   = 11 *)
  170.                                           (* +       MaxZeile                *)
  171.     ELSE
  172.       DruckeQuadrupel(QuadListe[Zaehler]);
  173.       INC(Zaehler);
  174.     END;
  175.     
  176.     IF (BefehlsListe[Zeiger] = "b") AND Fehler THEN             (* begin *)
  177.       INC(Begin);
  178.       DruckeLeerzeichen(Anzahl*Leerzeichen);
  179.       WriteString("begin");WriteLn;
  180.       INC(Leerzeichen);
  181.       INC(Zeiger);
  182.       Fehler:=FALSE;
  183.     END;
  184.     
  185.     IF (BefehlsListe[Zeiger] = "e") AND Fehler THEN             (* end   *)
  186.       DEC(Begin);
  187.       DEC(Leerzeichen);
  188.       DruckeLeerzeichen(Anzahl*Leerzeichen);
  189.       WriteString("end");
  190.       INC(Zeiger);
  191.       IF BefehlsListe[Zeiger] = ";" THEN
  192.         Write(";");
  193.         INC(Zeiger);
  194.       END;
  195.       WriteLn;
  196.       Fehler:=FALSE;
  197.  
  198.       IF While # 0 THEN              (* Gehoert diese end-Anweisung zu einem *)
  199.                                      (* while-begin Konstrukt ???            *)
  200.         WhileBegin[While]:=FALSE;
  201.         WHILE NOT(WhileBegin[While]) AND (While >= 1) DO
  202.           DEC(Leerzeichen);
  203.           DEC(While);
  204.         END;
  205.       END;
  206.     END;
  207.     
  208.     IF (BefehlsListe[Zeiger] = "X") AND Fehler THEN             (* Zuweisung *)
  209.       DruckeLeerzeichen(Anzahl*Leerzeichen);
  210.       Zeiger:=DruckeZuweisung(BefehlsListe,Zeiger);
  211.       Fehler:=FALSE;
  212.     END;
  213.  
  214.     IF (BefehlsListe[Zeiger] = "U") AND Fehler THEN         (* Unterprogramm *)
  215.       DruckeLeerzeichen(Anzahl*Leerzeichen);
  216.       Zeiger:=DruckeUnterprogramm(BefehlsListe,Zeiger);
  217.       Fehler:=FALSE;
  218.     END;
  219.  
  220.     
  221.             
  222.     IF (BefehlsListe[Zeiger] = "w") AND Fehler THEN                 (* while *)
  223.       DruckeLeerzeichen(Anzahl*Leerzeichen);
  224.       Zeiger:=DruckeSchleife(BefehlsListe,Zeiger);
  225.       
  226.       IF BefehlsListe[Zeiger] = "X" THEN             (* while-X:=X Konstrukt *)
  227.         DruckeQuadrupel(QuadListe[Zaehler]);
  228.         INC(Zaehler);
  229.         DruckeLeerzeichen(Anzahl*(Leerzeichen+1));
  230.         Zeiger:=DruckeZuweisung(BefehlsListe,Zeiger);
  231.         
  232.         IF While # 0 THEN
  233.           WHILE NOT(WhileBegin[While]) AND (While >=1) DO
  234.             DEC(Leerzeichen);
  235.             DEC(While);
  236.           END;
  237.         END;
  238.       ELSE
  239.         IF BefehlsListe[Zeiger] = "w" THEN
  240.           INC(While);
  241.           INC(Leerzeichen);
  242.         ELSE                            (* while-begin Konstrukt *)
  243.           INC(While);
  244.           INC(Leerzeichen);
  245.           WhileBegin[While]:=TRUE;
  246.         END;
  247.       END;
  248.       Fehler:=FALSE;
  249.     END;
  250.     
  251.     IF Fehler THEN
  252.       WriteLn;
  253.       WriteString("Dies ist kein while-Programm!!!");WriteLn;
  254.       HALT;
  255.     END;
  256.     
  257.   UNTIL Begin = 0;
  258. END Drucke;
  259.  
  260. END QuadDrucke.
  261.